package de.slothsoft.dome.database;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import de.slothsoft.dome.core.Todo;

public class TodosDataSource {

	// Database fields
	private SQLiteDatabase database;
	private DoMeSqlHelper dbHelper;

	public TodosDataSource(Context context) {
		dbHelper = new DoMeSqlHelper(context);
	}

	public void open() throws SQLException {
		database = dbHelper.getWritableDatabase();
	}

	public void close() {
		dbHelper.close();
	}

	public Todo createTodo(Todo item) {
		return createTodo(item.getName(), item.getDescription());
	}

	public Todo createTodo(String name, String description) {
		ContentValues values = new ContentValues();
		values.put(DoMeSqlHelper.COLUMN_TODO_NAME, name);
		values.put(DoMeSqlHelper.COLUMN_TODO_DESCRIPTION, description);
		long insertId = database
				.insert(DoMeSqlHelper.TABLE_TODOS, null, values);
		return getTodo(insertId);
	}

	public Todo updateTodo(Todo todo) {
		ContentValues values = new ContentValues();
		values.put(DoMeSqlHelper.COLUMN_TODO_NAME, todo.getName());
		values.put(DoMeSqlHelper.COLUMN_TODO_DESCRIPTION, todo.getDescription());
		database.update(DoMeSqlHelper.TABLE_TODOS, values,
				DoMeSqlHelper.COLUMN_ID + " = " + todo.getId(), null);
		return getTodo(todo.getId());
	}

	public Todo getTodo(long id) {
		Cursor cursor = database.query(DoMeSqlHelper.TABLE_TODOS,
				DoMeSqlHelper.COLUMNS_TODO, DoMeSqlHelper.COLUMN_ID + " = "
						+ id, null, null, null, null);
		cursor.moveToFirst();
		Todo newTodo = cursorToTodo(cursor);
		cursor.close();
		return newTodo;
	}

	public void deleteTodo(Todo todo) {
		deleteTodo(todo.getId());
	}

	public void deleteTodo(long id) {
		database.delete(DoMeSqlHelper.TABLE_TODOS, DoMeSqlHelper.COLUMN_ID
				+ " = " + id, null);
	}

	public void deleteAllTodos() {
		database.delete(DoMeSqlHelper.TABLE_TODOS, null, null);
	}

	public List<Todo> getAllTodos() {
		List<Todo> todos = new ArrayList<Todo>();

		Cursor cursor = database.query(DoMeSqlHelper.TABLE_TODOS,
				DoMeSqlHelper.COLUMNS_TODO, null, null, null, null, null);

		cursor.moveToFirst();
		while (!cursor.isAfterLast()) {
			Todo todo = cursorToTodo(cursor);
			todos.add(todo);
			cursor.moveToNext();
		}
		// Make sure to close the cursor
		cursor.close();
		return todos;
	}

	private Todo cursorToTodo(Cursor cursor) {
		return new Todo(cursor.getLong(0), cursor.getString(1),
				cursor.getString(2));
	}

}